from requests import get
from requests.exceptions import RequestException
from lxml.html import fromstring


def get_ip(search_url):
    """
    功能：根据域名查询其对应的ip地址
    函数名：get_ip
    参数：search_url    待查询的域名
    说明：
        每查询到一个ip，则把对应的域名、ip地址、物理地址以列表的形式插入到返回结果中;
        如果没有查到ip，则把查询提示信息插入到返回结果中;
        如果输入的域名错误，则把相应的提示信息插入到返回结果中。
    返回值：query_result,类型list
    """
    query_result = []  # 保存查询结果
    target_url = f'https://ip.tool.chinaz.com/{search_url}'  # 拼接url
    header = {
        'Accept': '*/*',
        'X-Requested-With': 'XMLHttpRequest',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
        'anhao': 'kingname',
        'Content-Type': 'application/json; charset=utf-8',
        'Referer': 'http://exercise.kingname.info/exercise_headers.html',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9'}  # 请求头
    try:
        response = get(target_url, headers=header).text  # 发送请求并接收响应
        selector = fromstring(response)  # 解析成html
        ip = selector.xpath(
            '//*[@id="leftinfo"]/div[3]/div[2]/div[@class="WhwtdWrap bor-b1s col-gray03"]/span[2]/text()')  # 根据xpath路径提取ip地址
        addr = selector.xpath('//*[@id="infoLocation"]/text()')  # 根据xpath路径提取ip所在的物理地址

        if len(ip) == len(addr):  # 判断提取的信息是否匹配
            for i in range(len(ip)):  # 如果提取的信息匹配，则将域名、ip、物理地址以列表形式插入到列表中
                query_result.append([search_url, ip[i], addr[i]])

        if len(ip) == 0:  # 如果没有提取到ip地址，则提取提示信息
            query_result = selector.xpath('/html/body/div[2]/div[1]/div[2]/form/div[2]/text()')

    except RequestException:
        query_result.append('输入错误，示例www.test.com')  # 如果报异常，则返回错误提示信息
    except Exception as error:
        print(f"位置错误：{error}")
    finally:
        return query_result  # 返回查询结果


if __name__ == '__main__':
    url = 'www.taobao.com'
    get_ip(url)
